[XENAPI] Support for VBD/VIF info listing in vm-list --long
authorAlastair Tse <atse@xensource.com>
Fri, 6 Oct 2006 15:30:35 +0000 (16:30 +0100)
committerAlastair Tse <atse@xensource.com>
Fri, 6 Oct 2006 15:30:35 +0000 (16:30 +0100)
Signed-off-by: Alastair Tse <atse@xensource.com>
tools/python/scripts/README [new file with mode: 0644]
tools/python/scripts/xapi.py

diff --git a/tools/python/scripts/README b/tools/python/scripts/README
new file mode 100644 (file)
index 0000000..a5d8759
--- /dev/null
@@ -0,0 +1,49 @@
+Xen API Test
+============
+
+xapi.py is a simple command line tool to test the functionality of a
+domain lifecycle supporting, Xen API talking version of Xend.
+
+Creating a VM is slightly more work under the Xen API. The differences
+with this and xm is:
+
+1. None of the devices are created during vm-create. You must use
+   vbd-create and vif-create to attach a new device to the VM.
+
+2. VM's that are created using vm-create will not start by
+   default. You must use vm-start to "start" the domain.
+
+3. VM's that are created using vm-create will not be removed on
+   shutdown. You must remove it using vm-delete.
+
+Example Configuration Files
+---------------------------
+
+xapi.py uses a simple python configuration file similar to xm in the
+face of the lack of any other reasonable format.
+
+All the fields are directly mapped to the arguments that are in the
+Xen API constructore for the respective classes.
+
+xapi.domcfg.py: example configuration for a paravirtualised domain.
+xapi.vbdcfg.py: example configuration for a file based block device.
+xapi.vifcfg.py: example configuration for a simple bridged network
+                device.
+
+Example Session
+---------------
+
+xapi.py vm-list
+xapi.py vm-create xapi.domcfg.py
+xapi.py vbd-create <DomainName> xapi.vbdcfg.py
+xapi.py vif-create <DomainName> xapi.vifcfg.py
+
+Notes
+-----
+
+Currently lacking:
+
+1. Any real authentication. XendAuthSessions need to be filled in with
+   a proper authentication implementation either using PAM or other
+   means.
+
index 4e12dc97b5a18cbd3f7a0c604e4c5e1e7a815615..5c5dddc1967fd3ac44e8a67f14f405fbe6b34e2a 100644 (file)
@@ -36,7 +36,7 @@ COMMANDS = {
     'vm-delete': ('<domname>', 'Delete VM'),
     
     'vm-destroy': ('<name>', 'Hard shutdown a VM with name'),
-    'vm-list':   ('', 'List all domains.'),
+    'vm-list':   ('[--long]', 'List all domains.'),
     'vm-name':   ('<uuid>', 'Name of UUID.'),
     'vm-shutdown': ('<name>', 'Shutdown VM with name'),
     'vm-start':  ('<name>', 'Start VM with name'),
@@ -62,13 +62,15 @@ class XenAPIError(Exception):
 #
 
 def parse_args(cmd_name, args):
+    argstring, desc = COMMANDS[cmd_name]
+    parser = OptionParser(usage = 'xapi %s %s' % (cmd_name, argstring),
+                          description = desc)
     if cmd_name in OPTIONS:
-        parser = OptionParser()
         for optargs, optkwds in OPTIONS[cmd_name]:
             parser.add_option(*optargs, **optkwds)
-        (opts, extraargs) = parser.parse_args(list(args))
-        return opts, extraargs
-    return None, []
+            
+    (opts, extraargs) = parser.parse_args(list(args))
+    return opts, extraargs
 
 def execute(fn, *args):
     result = fn(*args)
@@ -141,6 +143,18 @@ def xapi_vm_list(*args):
     for uuid in vm_uuids:
         vm_info = execute(server.VM.get_record, session, uuid)
         if is_long:
+            vbds = vm_info['vbds']
+            vifs = vm_info['vifs']
+            vif_infos = []
+            vbd_infos = []
+            for vbd in vbds:
+                vbd_info = execute(server.VBD.get_record, session, vbd)
+                vbd_infos.append(vbd_info)
+            for vif in vifs:
+                vif_info = execute(server.VIF.get_record, session, vif)
+                vif_infos.append(vif_info)
+            vm_info['vbds'] = vbd_infos
+            vm_info['vifs'] = vif_infos
             pprint(vm_info)
         else:
             print VM_LIST_FORMAT % _stringify(vm_info)
@@ -234,15 +248,18 @@ def xapi_vif_create(*args):
 #
 
 def usage(command = None):
-    print 'Usage: xapi <subcommand> [options] [args]'
-    print
-    print 'Subcommands:'
-    print
-    sorted_commands = sorted(COMMANDS.keys())
-    for command  in sorted_commands:
-        args, description = COMMANDS[command]
-        print '%-16s  %-40s' % (command, description)
-    print
+    if not command:
+        print 'Usage: xapi <subcommand> [options] [args]'
+        print
+        print 'Subcommands:'
+        print
+        sorted_commands = sorted(COMMANDS.keys())
+        for command  in sorted_commands:
+            args, description = COMMANDS[command]
+            print '%-16s  %-40s' % (command, description)
+        print
+    else:
+        parse_args(command, ['-h'])
 
 def main(args):
 
@@ -267,7 +284,7 @@ def main(args):
         subcmd_func(*args[1:])
     except XenAPIError, e:
         print 'Error: %s' % str(e.args[1])
-        sys.exit(1)
+        sys.exit(2)
 
     sys.exit(0)